#include <iostream>
#include <mutex>

using namespace std;

class singleton
{
public:
	static singleton* getinstance()
	{
		if (ptr == nullptr)
		{
			mtx.lock();
			if (ptr == nullptr)
				ptr = new singleton();
			mtx.unlock();
		}
		return ptr;
	}

	class cb
	{
	public:
		~cb()
		{
			if (ptr)
			{
				cout << "析构" << endl;
				delete ptr;
				ptr = nullptr;
			}
		}
	};

	static cb b;
private:
	singleton()
	{
		cout << "构造" << endl;
	}

	singleton(const singleton&) = delete;
	singleton& operator=(const singleton&) = delete;

	static singleton* ptr;
	static mutex mtx;
};

mutex singleton::mtx;
singleton* singleton::ptr = nullptr;
singleton::cb b;

/*
这个`cb`类是一个**内部清理类（cleanup class）**，用于在程序结束时自动释放单例对象的内存。：

1. **自动内存清理**：
   - 单例对象通常在堆上分配内存（`new singleton()`）
   - 如果不手动`delete`，会造成内存泄漏
   - 通过静态析构函数在程序结束时自动清理

2. **利用C++析构函数特性**：
   - 静态对象的析构函数会在程序退出时自动调用
   - 在`cb`的析构函数中删除单例对象
*/